home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / RegularExp.C < prev    next >
C/C++ Source or Header  |  1992-05-05  |  5KB  |  178 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "RegularExp.h"
  6.  
  7. #include "Class.h"
  8. #include "String.h"
  9. #include "Math.h"
  10.  
  11. SmartRegularExp gRexDouble("\\(+\\|-\\)?[0-9]*\\(\\.[0-9]*\\)?\\([eE]\\(+\\|-\\)?[0-9]*\\)?"),
  12.         gRexInt("\\(+\\|-\\)?[0-9]*");
  13.         
  14. //---- C++ interface to regex.c ------------------------------------------------
  15.  
  16. extern "C" {
  17.     char *re_compile_pattern (char *pat, int,struct re_pattern_buffer *bufp);
  18.     struct re_pattern_buffer *re_get_pattern_buffer(bool case_sensitive);
  19.     void free_re_pattern_buffer(struct re_pattern_buffer *);
  20.     void re_compile_fastmap (struct re_pattern_buffer *);
  21.     int re_match (struct re_pattern_buffer *, char *, int, int, RegExRegs *regs);
  22.     int re_match_2 (struct re_pattern_buffer *, char *, int, char *, int, int, 
  23.                         RegExRegs *regs, int);
  24.     int re_search (struct re_pattern_buffer *, char *str, int size, 
  25.                    int start, int range, RegExRegs*,int *len);
  26.     int re_search_2 (struct re_pattern_buffer *, char *str1, int size1,
  27.         char *str2, int size2, int startpos, int range, RegExRegs *regs,
  28.         int mstop, int *len); 
  29. }
  30.  
  31. //---- Regular Expression ------------------------------------------------------
  32.  
  33. NewMetaImpl(RegularExp,Object, (TP(source), TP(result), TB(caseSensitive), TB(fastSearch)));
  34.  
  35. RegularExp::RegularExp(char *pat, bool cs, bool fs)
  36. {
  37.     if (pat == 0)
  38.     pat= "";
  39.     caseSensitive= cs;
  40.     fastSearch= fs;
  41.     pb= re_get_pattern_buffer(caseSensitive);
  42.     source= strsave(pat);
  43.     result= re_compile_pattern(source, strlen(source), pb);
  44.     if (fastSearch)
  45.     re_compile_fastmap(pb);
  46. }
  47.  
  48. RegularExp::~RegularExp()
  49. {
  50.     if (pb) {
  51.     free_re_pattern_buffer(pb);
  52.     pb= 0;
  53.     }
  54.     SafeDelete(source);
  55. }
  56.  
  57. void RegularExp::Reset(char *pat, bool cs, bool fs)
  58. {
  59.     if (strcmp(pat, source) == 0 && cs == caseSensitive && fs == fastSearch)
  60.     return; // no recompilation necessary
  61.     if (pb)
  62.     free_re_pattern_buffer(pb);
  63.     strreplace(&source, pat);
  64.     caseSensitive= cs;
  65.     fastSearch= fs;
  66.     pb= re_get_pattern_buffer(caseSensitive);
  67.     result= re_compile_pattern (pat, strlen(pat), pb);
  68.     if (fastSearch)
  69.     re_compile_fastmap (pb);
  70. }
  71.  
  72. char *RegularExp::GetExprState()
  73. {
  74.     return result;
  75.  
  76. int RegularExp::Match (char *pat, int pos, int len, RegExRegs *regs)
  77. {
  78.     if (len == -1) 
  79.     len= strlen(pat);
  80.     return re_match(pb, pat, len, pos, regs);    
  81.  
  82. int RegularExp::Match2 (char *str1, char *str2, int len1,
  83.             int len2, int pos, int stopMatchAt, RegExRegs *regs)
  84. {
  85.     if (len1 == -1) 
  86.     len1= strlen(str1);
  87.     if (len2 == -1)
  88.     len2= strlen(str2);
  89.     stopMatchAt= Math::Range(0, len1+len2, stopMatchAt);
  90.     return re_match_2(pb, str1, len1, str2, len2, pos, regs, stopMatchAt);
  91.  
  92. int RegularExp::SearchForward (char *string, int *nMatched,int start,  
  93.                     int len, int itsRange, RegExRegs *regs)
  94. {
  95.     if (len == -1) 
  96.     len= strlen(string);
  97.     start= Math::Range(0,len-1,start);
  98.     itsRange= Math::Range(0,len - start,itsRange);
  99.     return re_search(pb, string, len, start, itsRange, regs, nMatched);
  100. }
  101.  
  102. int RegularExp::SearchBackward (char *string, int *nMatched,int start,  
  103.                     int len, int itsRange, RegExRegs *regs)
  104. {
  105.     if (len == -1) 
  106.     len= strlen(string);
  107.     start= Math::Range(0,len,start);
  108.     itsRange= Math::Range(0,start,itsRange);
  109.     return re_search(pb, string, len, start, -itsRange, regs, nMatched);
  110. }
  111.  
  112. int RegularExp::SearchForward2 (char *str1, int len1, char *str2, int len2,
  113.             int start, int itsRange, RegExRegs *regs, int *nMatched)
  114. {
  115.     if (len1 == -1) 
  116.     len1= strlen(str1);
  117.     if (len2 == -1)
  118.     len2= strlen(str2);
  119.     int clen= len1+len2;
  120.     start= Math::Range(0, clen-1, start);
  121.     itsRange= Math::Range(0,clen - start,itsRange);
  122.     int mstop= start+itsRange;
  123.     return re_search_2(pb, str1, len1, str2, len2, start, itsRange, regs, mstop, nMatched); 
  124. }
  125.  
  126. int RegularExp::SearchBackward2 (char *str1,int len1, char *str2, int len2,
  127.             int start, int itsRange, RegExRegs *regs, int *nMatched)
  128. {
  129.     if (len1 == -1) 
  130.     len1= strlen(str1);
  131.     if (len2 == -1)
  132.     len2= strlen(str2);
  133.     int clen= len1+len2;
  134.     start= Math::Range(0, clen-1, start);
  135.     itsRange= Math::Range(0,start+1,itsRange);
  136.     int mstop= start-itsRange;
  137.     return re_search_2(pb, str1, len1, str2, len2, start, -itsRange, regs, mstop, nMatched); 
  138. }
  139.  
  140. const char *RegularExp::GetPattern()
  141. {
  142.     return source;
  143. }
  144.  
  145. const char *RegularExp::MatchWordPattern()
  146. {
  147.     return "\\<%s\\>";
  148. }
  149.  
  150. OStream& RegularExp::PrintOn(OStream& s)
  151. {
  152.     Object::PrintOn(s);
  153.     s.PrintString(source);
  154.     return s SP << caseSensitive SP << fastSearch SP;
  155. }
  156.  
  157. IStream& RegularExp::ReadFrom(IStream& s)
  158. {
  159.     Object::ReadFrom(s);
  160.     SafeDelete(source);
  161.     s.ReadString(&source);
  162.     s >> Bool(caseSensitive) >> Bool(fastSearch);
  163.     pb= re_get_pattern_buffer(caseSensitive);
  164.     result= re_compile_pattern (source, strlen(source), pb);
  165.     if (fastSearch)
  166.     re_compile_fastmap(pb);
  167.     return s;
  168. }
  169.  
  170. void RegularExp::InspectorId(char *buf, int sz)
  171. {
  172.     strn0cpy(buf, source, sz);
  173. }
  174.  
  175.